FUNCTION INSERTION_SORT : BOOL
  VAR_INPUT
    // 指向待排序整数数组的引用
    pData : REF_TO INT;
    // 数组元素个数
    udiSize : UDINT;
  END_VAR

  VAR
    // 外层循环计数器，从第二个元素开始
    i : UDINT;
    // 内层循环计数器
    j : UDINT;
    // 当前要插入的元素值
    key : INT;
  END_VAR

  // 检查输入参数有效性
  IF pData = 0 OR udiSize <= 1 THEN
    INSERTION_SORT := FALSE;
    RETURN;
  END_IF;

  // 插入排序算法
  FOR i := 1 TO udiSize - 1 DO
    // 保存当前要插入的元素
    key := (pData+i)^;
    j := i;
    
    // 在已排序的部分中找到正确的插入位置
    WHILE j > 0 AND (pData+j-1)^ > key DO
      // 将较大的元素向右移动
      (pData+j)^ := (pData+j-1)^;
      j := j - 1;
    END_WHILE;
    
    // 将key插入到正确位置
    (pData+j)^ := key;
  END_FOR;

  INSERTION_SORT := TRUE;

END_FUNCTION
